/**
 * mdp框架前端与后端交互核心公共api
 * 一般情况下请勿将业务代码加入此文件，业务代码及其它模块及api应该放入各自单独的api文件中，如果实在要添加，请添加到$mdp_api_biz.js文件中，实现全局调用
 * 扩展组件的api请加入到fly_mdp_ext.js中
 */ 
import axios from '@/config/maxios'
import util from '@/components/mdp-ui/js/util';//全局公共库
import {sn} from '@/components/mdp-ui/js/sequence';//全局公共库
import config from './mdp_config'
let sysBase = config.getSysCtx();

const mdpBaseCache=new Map();

const allItems=new Map();

const sysParamItems=new Map();


axios.get(`/${sysBase}/mdp/meta/item/dicts`, { params: {categoryIds:['sysParam','all']} }).then(res=>{
  if(res.tips.isOk){
    res.data.forEach(item=>{
      if(item.categoryId=='all'){
        allItems.set(item.itemCode,item)
      }else if(item.categoryId=='sysParam'){
        sysParamItems.set(item)
      }
     })
  } 
   
})

const colors=['#909399','#409EFF','#67C23A','#E6A23C','#F56C6C','#00ced1','#c71585','#ff8c00','#c7158577','#ffd700'];

var funcs = {

  ...util,
/**
 * 从后端请求数据字典列表
 * @param {*} params {itemCode:xxx,categoryId:xxx,....其它参数}
 * @returns
 */
 getDicts: function(params){ return axios.get(`/${sysBase}/mdp/meta/item/dicts`, { params: params }); },

 /**
  * 检查某个按钮是否具有访问权限
  * @param {*} btnId 按钮编号
  * @param {*} menuDefId
  * @returns true/false
  */
 checkBtnQx:function(btnId,menuDefId,params){
   return true;
 },

 /**
  * 从后台远程加载所有all、sysParam两大分类字典数据
  * @returns 
  */
 getAllDicts:function(){
  return new Promise((resolve,reject)=>{
    axios.get(`/${sysBase}/mdp/meta/item/dicts`, { params: {categoryIds:['sysParam','all']} }).then(res=>{
      if(res.tips.isOk){
        res.data.forEach(item=>{
          if(item.categoryId=='all'){
            allItems.set(item.itemCode,item)
          }else if(item.categoryId=='sysParam'){
            sysParamItems.set(item.itemCode,item)
          }
         })
         resolve(res)
      }else{
        resolve(res)
      } 
       
    }).catch(e=>reject(e))
  })
 },
  /**
  * 批量修改状态之间的跳转关系
  * @returns 
  */
   unTargets:function(params){
    return new Promise((resolve,reject)=>{
      axios.post(`/${sysBase}/mdp/meta/itemOption/unTargets`, params).then(res=>{
        if(res.tips.isOk){ 
          funcs.clearDictCache()
           resolve(res)
        }else{
          resolve(res)
        } 
         
      }).catch(e=>reject(e))
    })
   },
  /**
   * 生成缓存key
   * @param {*} itemCode
   * @param {*} params
   * @returns
   */
  getCodeKey:function (itemCode,params){
    var codeKey='mdp-dict-cache'+'@'+itemCode
    if(params){
      for (let [key, value] of Object.entries(params)) {
        if(key=="itemCode"){
          continue;
        }
        codeKey=codeKey+"@"+key+":"+value
       }
    }
    return codeKey;
  },
  /**
   * 清除所有字典缓存并从新从服务器拉取 
   * @returns 
   */
clearDictCache:function(){ 
    return funcs.getAllDicts()   
},

getDictFromCache:function(itemCode,categoryId = 'all'){
  if(categoryId=='all'){
    return allItems.get(itemCode)
  }else{
    return sysParamItems.get(itemCode)
  }
},

/**
 * 页面上获取一个字典数据，用于其它用途
 * 用法: this.$mdp.getDict('dclass','all').then(d=>this.dclassDict=d)
 * @param {*} itemCode 字典代码
 * @param {*} categoryId 分类，默认为all 通用参数,sysParam 系统参数
 * @returns {id:'xxx',itemName:'',itemCode:'',categoryId:'',extInfos:'',options:[]}
 */
 getDict:function(itemCode,categoryId='all'){
  return new Promise((resolve,reject)=>{
    if(allItems.size===0){
      funcs.getAllDicts().then(res=>{
        let dict=funcs.getDictFromCache(itemCode,categoryId)
        resolve(dict)
      }).catch(e=>reject(e))
    }else{
      let dict=funcs.getDictFromCache(itemCode,categoryId)
      resolve(dict)
    }
   
})

},

/**
 * 根据传入的参数过滤掉部分不需要的选项
 * @param {*} optionList 
 * @param {*} params 
 * @returns 
 */
filterOptions:function(optionList,params){
  if(optionList && optionList.length>0){ 
    let options=[]
    let subKeys=null
    let has=false
    if(params!=null){ 
      subKeys=[]
      ['relyType','relyId','relyStype','relySid'].forEach(key=>{
        let v=params[key]
        if(v){
          has=true;
          subKeys.push(key)
        } 
      })
    }
    if(has){
      options=optionList.filter(o=>subKeys.findIndex(key=>params[key]!=o[key])<0 )
      return (options?.length>0?options:[])
    }else{
      return (optionList)
    }
  }else{
    return []
  }
},

/**
 * 页面上获取一个字典的列表数据，用于其它用途
 * @param {*} itemCode 
 * @param {*} params {relyType:'',relyId:'',relyStype:'',relySid:''}
 * @returns 
 */
getDictOptions:function(itemCode, params){
  return new Promise((resolve,reject)=>{
  funcs.getDict(itemCode,params?.categoryId||'all').then(data=>{ 
      if(data && data.options){ 
         resolve(funcs.filterOptions(data.options,params))
      }else{
        resolve([])
      } 
  }).catch(e=>reject(e))
})

},


 /**
  * 默认颜色列表
  * @returns
  */
 getDefaultColors:function(){
  return colors
 },

 /**
  * 根据id获取系统默认的对应颜色
  * @param {*} id
  * @returns
  */
 getColorById(id){
    var cellValue=id
    var colors=this.getDefaultColors();
    if(!cellValue){
      return colors[0]
    }
    var cellValueInt=parseInt(cellValue)
      if( isNaN( cellValueInt) ){
        if(typeof cellValue =='string' && cellValue.length>0){
           var idxList=[]
           if(cellValue.length==1){
               idxList=[0]
           }else if(cellValue.length==2){
               idxList=[0,1]
           }else if(cellValue.length==3){
               idxList=[0,1,2]
           }else{
               idxList=[0,parseInt((cellValue.length-1)/2),cellValue.length-1]
           }

           cellValueInt=0;
           for(var i=0;i<idxList.length;i++){
               cellValueInt=cellValueInt+ cellValue.charCodeAt(idxList[i])
           }
        }else{
          cellValueInt=0;
        }
      }
      var colorIndex=cellValueInt % colors.length
      if(cellValueInt > 0 && colorIndex==0){
        colorIndex=1
      }
      return  colors[colorIndex]

},
 

/**
 * 反显字典值
 * @param {*} itemCode 字典代码
 * @param {*} value 字典值
 * @param {*} params 参数可空
 * @returns
 */
formatDict:async function(itemCode, value,params)
{
   if(!value){
    return value;
  }
  this.getDictOptions(itemCode,params).then(res=>{
    if(res?.length>0){
      var find=res.options.find(k=>k.id==value)
      if(find){
        return find.name
      }else{
        return value;
      }
    }else{
      return value;
    }
  })
},

createSeqNo:function(prefix){
  return  sn(prefix);
},
shortCode: function(str){ 
    let hash = 0;
    for (let i = 0; i < str.length; i++) {
      const char = str.charCodeAt(i);
      hash = (hash << 5) - hash + char;
      hash |= 0; // 将hash转换为32位整数
    }
    return hash & 0x7FFFFFFF; 
},
/**
 * 字段转成驼峰命名
 * @param {*} name
 */
  toCamel:function(name) {
    return name.toLowerCase().replace(/_(.)/g, function(match, group1) {
      return group1.toUpperCase();
    });
  },
/**
 * 驼峰转下横线
 * @param {*} name
 */
toLine:function(name) {
  return name.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();
}, 

}


export default funcs;


